//封装购物车模块
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import { useUserStore } from '@/stores/user'
import { inserCarStoreAPI, findNewCartListAPI, delCartAPI } from '@/apis/carStore'
export const useCartStore = defineStore('carStore', () => {
  //取token判断是否登录
  const userStore = useUserStore();
  const isLogin = computed(() => userStore.userInfo.token);
  //1.定义sate  购物车数据
  const carList = ref([])
  //2.定义action  操作购物车数据的方法(添加购物车)

  //更新购物车
  const updateNewList = async () => {
    const res = await findNewCartListAPI()
    carList.value = res.result
  }
  //添加购物车
  const addCart = async (goods) => {
    const { skuId, count } = goods
    // 添加购物车操作   ---如果已登录，走接口加入购物车，未登录走本地购物车操作
    if (isLogin.value) {
      await inserCarStoreAPI({ skuId, count })
      updateNewList()
      // // console.log(res, '9999')
    }

    else {
      // 已添加过 - count + 1
      // 没有添加过 - 直接push
      // 思路：通过匹配传递过来的商品对象中的skuId能不能在cartList中找到，找到了就是添加过
      //数组的find方法，如果找到则返回对象，没找到就返回undefine
      const item = carList.value.find((item) => goods.skuId === item.skuId)
      if (item) {
        // 找到了
        item.count++
      } else {
        // 没找到
        carList.value.push(goods)
      }
    }

  }
  //删除购物车
  const delCart = async (skuId) => {
    // 已登录调用接口实现接口购物车中的删除功能
    // console.log(isLogin.value, 'isLogin')
    if (isLogin.value) {
      await delCartAPI([skuId])
      //删除之后更新购物车列表
      updateNewList()
    } else {
      //思路（未登录）
      //1.找到要删除项的下标值 --splice
      //2.使用数组的过滤方法 --fitter
      //数组的findIndex返回数组的下标值
      //数组的splice方法，添加或删除元素，第二个值为1表删除
      const idx = carList.value.findIndex((item) => skuId === item.skuId)
      // console.log(idx, 'idx')
      carList.value.splice(idx, 1)
    }
  }

  //清除购物车
  const clearCarStore = () => {
    carList.value = []
  }
  //单选功能
  const singleCheck = (skuId, selected) => {
    // 通过skuId找到要修改的那一项 然后把它的selected修改为传过来的selected
    const item = carList.value.find((item) => item.skuId === skuId)
    item.selected = selected
  }
  // 全选功能action
  const allCheck = (selected) => {
    // 把cartList中的每一项的selected都设置为当前的全选框状态
    carList.value.forEach(item => item.selected = selected)
  }

  //是否全选
  const isAll = computed(() => carList.value.every((item) => item.selected))
  //已选择数量(等价于carList数组中所有selected字段为true项的count之和)
  const selectedCount = computed(() => carList.value.filter(item => item.selected).reduce((a, c) => a + c.count, 0))
  //已选择商品价格合计(等价于carList数组中所有selected字段为true项的count*price之和)
  const selectedPrice = computed(() => carList.value.filter(item => item.selected).reduce((a, c) => a + c.count * c.price, 0))
  return { carList, addCart, delCart, singleCheck, isAll, allCheck, selectedCount, selectedPrice, clearCarStore, updateNewList }
}, {
  persist: true
})